<?php
defined('_IN_CMS') or die('Fuck off');

class Db {
    // Класс для работы с БД (MySQL), синглтон
    // TODO
    // 1. Добавить PDO
    // 2. Конфигурация из файла (сервер, логин, пароль, БД)
    private static $instance;
    private static $db_server;     // Адрес сервера
    private static $db_username;   // Имя пользователя БД
    private static $db_password;   // Пароль пользователя
    private static $db_name;       // Имя БД
    private static $link;          // Ссылка на соединение
    private static $dbh;           // Database Handle
    private static $sth;           // Statement Handle
    public  static $queries_count; // Количество запросов
    public  static $table_name;    // Имена таблиц
    public  static $use_pdo;       // Использовать ли PDO

    public static function singleton() 
    {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }
        return self::$instance;
    }

    public function __construct()
    {
        self::$db_server     = '127.0.0.1';
        self::$db_username   = 'miha';
        self::$db_password   = 'qwerty';
        self::$db_name       = 'meowcms_00';
        self::$queries_count = 0;
        self::$use_pdo = true;
        // Имена таблиц
        self::$table_name['articles'] =            'articles00';
        self::$table_name['articles_sections'] =   'sections';
        self::$table_name['articles_categories'] = 'articles_categories';
        self::$table_name['articles_comments'] =   'comments00';
        self::$table_name['cms_settings'] =        'cms_settings';
        self::$table_name['dialogs'] =             'dialogs00';
        self::$table_name['gb'] =                  'gb00';
        self::$table_name['groups'] =              'groups';
        self::$table_name['guests'] =              'guests00';
        self::$table_name['mail'] =                'mail00';
        self::$table_name['forum'] =               'phorum';
        self::$table_name['forum_cats'] =          'phorum_categories';
        self::$table_name['forum_posts'] =         'phorum_messages';
        self::$table_name['forum_secs'] =          'phorum_sections';
        self::$table_name['forum_topics'] =        'phorum_topics';
        self::$table_name['settings'] =            'settings00';
        self::$table_name['statistics'] =          'statistic00';
        self::$table_name['users'] =               'users00';
        self::db_connect();
    }

    public function __clone()
    {
        trigger_error('нельзя клонировать класс Db', E_USER_ERROR);
    }

    public static function db_connect()
    {
        // Метод для соединения с БД
        if (self::$use_pdo) {
            // PDO
            try {
                self::$dbh = new PDO('mysql:host='.self::$db_server.';dbname='.self::$db_name, self::$db_username, self::$db_password);
                self::$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );  
                return self::$dbh;
            } 
            catch(PDOException $e) {  
                echo $e->getMessage();  
            }
        } else {
            // MySQL
            if (!self::$link) {
                self::$link = mysql_connect(self::$db_server, self::$db_username, self::$db_password);
                mysql_select_db(self::$db_name, self::$link);
                self::db_query("set names utf8");
            }
            return self::$link;
        }
    }

    public static function db_query($sql)
    {
        // Метод, выполняющий запроса к БД
        self::$queries_count++;
        if (self::$use_pdo) {
            self::$sth = self::$dbh->prepare($sql);
            //self::$sth->bindParam(":username", $username);
            //$username = 'ONE';
            self::$sth->execute();
        } else {
            return mysql_query($sql, self::$link);
        }
    }

    public static function insert_id()
    {
        // Метод, возвращающий номер вставленной строки
        return mysql_insert_id(self::$link);
    }
    
    public function __destruct()
    {
        if (self::$use_pdo)
        {
            self::$dbh = null;
        }
    }
    
    public static function db_rowCount()
    {
        return self::$sth->rowCount();
    }
}

?>
